/*!
	\file Symbole.h
	\brief La spécification de la classe Symbole

	Décrit la liste des méthodes et attributs associés à la class Symbole
	\author Arnaud MAILLET
	\date 03.01.2009
*/

/*! 
	\class Symbole
	\brief La classe permettant de construire les symboles d'un fichier

	Cette classe permet de construire les symboles d'un fichier
	Les méthodes suivantes sont associées à un objet de type Symbole :
	\li ==
	\li !=
	\li getChaine
	\li <<
	\li isMotCle
*/
#ifndef SYMBOLE_H_
#define SYMBOLE_H_

#include <iostream>
#include <vector>
#include <string>
using namespace std;

#define FICHIER_MOTS_CLE "motsCles.txt"

class Symbole {
public:
	//! Enumération de categorieSymbole
   	/*! Enumération des différentes catégories pour un symbole. */
	enum categorieSymbole { 
		MOTCLE, /*!< Enum value MOTCLE. */
		VARIABLE, /*!< Enum value VARIABLE. */
		ENTIER, /*!< Enum value ENTIER. */
		CHAINE,	/*!< Enum value CHAINE. */
		INDEFINI, /*!< Enum value INDEFINI. */
		FINDEFICHIER /*!< Enum value FINDEFICHIER. */
	};

	/*! 
	\fn Symbole(string s=string(""))
	\brief Constructeur de la classe Symbole.

	Ce constructeur permet de construire le symbole à partir de la chaine (string) s lue par le lecteur de symbole dans un fichier
	\param s - la chaine du symbole
        */
	Symbole(string s=string(""));

	/*! 
	\fn bool operator == (string ch)
	\brief Pour tester l'égalité entre le symbole et une chaîne
	\param ch - la chaine à comparer au symbole
	\return vrai si la chaine est égale au symbole
	*/
	bool operator == (string ch) ;

	/*! 
	\fn bool operator != (string ch)
	\brief Pour tester la difference entre le symbole et une chaîne
	\param ch - la chaine à comparer au symbole
	\return vrai si la chaine est différente au symbole
	*/
	inline bool operator != (string ch) { return ! (*this == ch); }

	/*! 
	\fn inline string getChaine()
	\brief Retourne la chaine du symbole
	\return la valeur de la chaine du symbole
	*/
	inline string getChaine() { return this->chaine; }

	/*! 
	\fn friend ostream & operator <<(ostream & cout, Symbole symb)
	\brief Fonction amie pour pouvoir afficher un symbole sur cout
	\param cout - le cout qu'on va utiliser pour afficher le symbole
	\param symb - symbole à afficher sur cout
	\return la valeur de la chaine du symbole sur cout
	*/
	friend ostream & operator <<(ostream & cout, Symbole symb);

private:

	/*!
	\var string chaine
	\brief Contient la chaine du symbole
	*/
	string chaine;

	/*!
	\var categorieSymbole categorie
	\brief Contient la categorie du symbole
	*/
	categorieSymbole categorie;

	/*! 
	\fn static bool isMotCle(string s)
	\brief Renvoie vrai si s est un mot clé du langage
	\param s - la chaine à tester
	\return vrai si s est un mot clé du langage
	*/
	static bool isMotCle(string s);
};

#endif /* SYMBOLE_H_ */
